Первый оффлайн-журнал о Visual Basic. Выпуск #1

Создаём оболочку для CD

Вступление

Поводом для написании этой статьи стало следующее, я очень люблю выступать на различных конференциях и конкурсах со своими программами. Программы свои, я записываю на CD-R болванку. И чтобы эффектнее представить программы, я создаю оболочку для CD и конечно же создаю её на своём любимом Visual Basic. Но существует одна проблема, все программы, написанные на Visual Basic требуют библиотеки msvbvm60.dll (для Visual Basic 6.0) и эта msvbvm60.dll есть не на каждом компьютере. Представьте себе такую ситуацию, вы засунули свой CD в компьютер, но вместо вашей оболочки появляется сообщение об ошибке. В данной статье я предлагаю свои способы решения данной проблемы.
Примечание: перечисленные ниже способы не тестировались на реальных CD, так что вы используете их на свой страх и риск.

Решение проблемы

Способ №1: с помощью дополнительной программы

1. Откройте блокнот и запишите туда следующее:

[autorun]
OPEN = setup.exe

Сохраните текстовый файл как Autorun.inf

2. Теперь в корневом каталоге вашего CD обязательно должны быть файлы autorun.inf (ранее созданный текстовый файл), msvbvm60.dll (нужная библиотека), autorun.exe (созданная вами оболочка), setup.exe (программа, написанная мной на PowerBasic (загрузить здесь) регистрирует msvbvm60.dll и запускает autorun.exe)

Теперь при открытии CD будет появлятся диалоговое окно о том, что библиотека зарегистрирована и будет запущена ваша оболочка.
Если ваша программа нуждается не только в библиотеке msvbvm60.dll, но и дополнительных компонентах, то можете попробовать способ №2

Способ №2: всё делаем сами

1. Откройте блокнот и запишите туда следующее:

[autorun]
OPEN = setup.bat

Сохраните текстовый файл как Autorun.inf

2. Если вы закрыли блокнот откройте его, а если нет, создайте новый текстовый файл и запишите туда следующее:

@Echo off
Rem регистрируем msvbvm60.dll
regsvr32 msvbvm60.dll
Rem чтобы зарегистривать еще один компонент введите ещё одну строку: regsvr32 ИМЯ ВАШЕГО КОМПОНЕНТА, столько раз, сколько компонентов

Сохраните текстовый файл как Setup.bat

3. Теперь в корневом каталоге вашего CD обязательно должны быть файлы autorun.inf (ранее созданный текстовый файл), msvbvm60.dll (нужная библиотека), autorun.exe (созданная вами оболочка), setup.bat (ранее созданный исполняемый файл DOS) и все ваши компоненты.

Теперь при открытии CD появиться столько диалоговых окон о регистрации, сколько компонентов вы регистрируете, после этого будет запущена ваша оболочка.
В обоих этих способах есть один недостаток - лишние диалоговые окна, если у вас есть свои способы, пишите.

Автор статьи: Хованский Ян (web: yansoft.by.ru)


Проигрываем звук через внутренний динамик

В этой статье я расскажу вам о том, как выдавать звуковой сигнал через внутренний динамик. Для этого мы воспользуемся Api функцией Beep. Ну что, перейдём к делу:
1. Создайте новый проект.
2. На созданную вместе с проектом форму добавьте две метки (lbl1, lbl2) , две горизонтальные полосы прокрутки (srlChastota и srlTime) и одну кнопку (cmdGen):

Имя элемента управления: | Свойство: | Значение:
lbl1 | Caption | Частота звука:
lbl2 | Caption | Продолжительность звука:
srlChastota | Min | 37
srlChastota | Max | 32767
srlTime | Min | 0
srlTime | Max | 10000
cmdGen | Caption | &Сгенерировать сигнал

После всех перечисленных выше действий форма должна выглядеть примерно так:

3. Добавьте следующий код:

Option Explicit
'Функция генерирует звуковой сигнал
Private Declare Function Beep Lib "kernel32" (ByVal dwFreq As Long, ByVal dwDuration As Long) As Long
'dwFred - частота звука
'dwDuration - продолжительность сигнала в миллисекундах

Private Sub cmdGen_Click()
'Генерируем звук
Beep srlChastota.Value, srlTime.Value
End Sub

Вот и всё! Вы создали программу для генерации звука из системного динамика.
Пример здесь


Частые вопросы

Вопросы, которые были найдены мной в форумах на различных VB сайтах:

В: Как сделать так, чтобы нельзя было запустить две копии моей программы?
О: Добавьте в событие form_load главной формы следующий код:

If App.PrevInstance = True Then
MsgBox "Программа уже запущенна!"
End
End I

В: Программное переключение клавиатуры RUS/LAT?
О: Следующий пример демонстрирует как это сделать:

' Функция для переключения раскладок клавиатуры
Private Declare Function ActivateKeyboardLayout Lib "user32" _
(ByVal HKL As Long, ByVal flags As Long) As Long
'Константы
Const kb_lay_ru As Long = 68748313 ' русский
Const kb_lay_en As Long = 67699721 ' английский

' Переключить на русский язык
ActivateKeyboardLayout kb_lay_ru, 0

' Переключить на английский язык
ActivateKeyboardLayout kb_lay_en, 0

В: Как открыть файл?
О: Следующий пример демонстрирует как это сделать:

' Функция для запуска файла.

Private Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" (ByVal hwnd As Long, ByVal lpOperation As String, _
ByVal lpFile As String, ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long

' Константы для максимизирования окна открываемого приложения.

Public Const SW_SHOWMAXIMIZED = 3

Call ShellExecute(0, "open", " C:\readme.txt","", "", SW_SHOWMAXIMIZED) 'Открываем файл C:\readme.txt

В: Как изменить обои рабочего стола
О: Следующий пример демонстрирует как это сделать:

'Функция изменяет различные системные настройки

Private Declare Function SystemParametersInfo Lib "user32" Alias "SystemParametersInfoA" (ByVal uAction As Long, ByVal uParam As Long, lpvParam As Any, ByVal fuWinIni As Long) As Long

'Константа определяет рисунок рабочего стола

Public Const SPI_SETDESKWALLPAPER = 20

'Использование

SystemParametersInfo SPI_SETDESKWALLPAPER, 0, ByVal "Имя файла", True

Наш небольшой FAQ подошёл к концу, есть вопросы пишите


Пишем говорящую программу

Вступление

Однажды в Интернете я нашёл интересную программу, называлась она Говорилка (программа проговаривает текст, который вы напечатали и записывает всё это в звуковой файл, я думаю многие слышали о ней). И в то время мне показалось, что эта прога верх совершенства и только опытнейший программер может написать что-либо подобное:)
И только потом я понял как сделать подобную прогу, хоть и уступающую Говорилке по возможностям, а произошло это чисто случайно, когда я наткнулся на один интересный контрол (Элемент управления) - Microsoft Voice text и разобрался в некоторых его свойствах и методах. Ближе к делу, начнём писать говорящую программу.

Что нам понадобится?

Для того, чтобы написанная программа работала, нам понадобится следующее:
1. Speech API - компонент, который позволяет программам работать с Text-to-speech engin`ами. Его можно бесплатно скачать на сайте Microsoft. В Windows 2000 SpeechAPI уже есть.
2. Text-to-speech engine (голосовой движок) - это набор файлов с описанием голоса. Позволяет синтезировать речь из текста. Существует много разных engin`ов различных производителей. Text-to-speech engin`ы отличаются качеством синтеза речи, количеством и характером голосов (мужчина, женщина, роботы), языком (русский, английский, французский, немецкий, ... ) и прочими параметрами.
После того, как вы скачали нужные компоненты можно будет двигаться дальше.

Пишем говорящую программу

1. Создайте новый проект.
2. Создайте новую форму.
3. Разместите на форме текстовое поле (text1), метку (label1) и кнопку (Command1)
4. Добавьте новый контрол - Microsoft Voice text (с изображением губ). Установите Visible = false. (Чтобы не надоедала)

Выглядёть форма должна примерно так:

5. Дважды кликните на Command1 и введите следующий код:

Private Sub Command1_Click()
'Запуск чтения текстового поля
TextToSpeech1.Speak Text1.Text
End Sub

6. Запустите проект и введите какую-нибудь фразу в текстовое поле и компьютер проговорит вам этот текст, качество голоса будет зависеть от установленного на вашем компьютере движка.
7. Одна строчка дополнительного кода и наша говорилка готова! Но и это ещё не всё, вы можете усовершенствовать программу. Можете ввести следующий код и установить громкость, высоту, скорость произношения и многое другое:
TextToSpeech1.GeneralDlg Me.hWnd, "Супер Говорун"

Автор статьи Хованский Ян (web: http://yansoft.by.ru)


This page uses frames, but your browser doesn't support them.


Visual Basic Forever!

Здравствуй дорогой читатель!!!

Перед тобой самый первый выпуск оффлайн-журнала Visual Basic Forever! Visual Basic Forever! - журнал, посвящённый программированию на Visual Basic. Журнал предназначен прежде всего для тех, кто уже начал программировать на VB.
Надеюсь, что в данном номере, вы сможете почерпнуть много новой и полезной для вас информации и найдёте ответы на нужные вам вопросы.

Хованский Ян (Редактор журнала)

Сайт журнала Visual Basic Forever! : http://yansoft.by.ru
E-mail: yan@newmail.ru


Прогрываем музыкальные файлы

В этой статье я расскажу вам как проигрывать музыкальные файлы различных форматов, а именно *.mp3, *.mid и *.wav.

1. Проигрываем файл в формате *.mp3:

'Функция для проигрывания файлов в формате *.mp3

Private Declare Function mciExecute Lib "winmm.dll" (ByVal lpstrCommand As String) As Long

'чтобы воспроизвести файл
Call mciExecute("play имя вашего файла")

'чтобы закрыть файл
Call mciExecute("close имя вашего файла")

2. Проигрываем файл в формате *.mid:

'Функция для проигрывания файлов в формате *.mid

Private Declare Function mciSendString Lib "winmm.dll" Alias "mciSendStringA" (ByVal lpstrCommand As String, ByVal lpstrReturnString As String, ByVal uRetrunLength As Long, ByVal hwndCallback As Long) As Long

'Открываем файл

Call mciSendString ("open ИМЯ ВАШЕГО ФАЙЛА type sequencer alias passport", 0, 0,0)

'Проигрываем файл

Call micSendString ("play passport", 0, 0, 0)

'Останавливаем файл

Call micSendString ("stop passport", 0, 0, 0)

3. Проигрываем файл в формате *.wav:

Функция для проигрывания файлов в формате *.wav

Private Declare Function sndPlaySound Lib "winmm.dll" Alias "sndPlaySoundA" (ByVal lpszSoundName As String, ByVal uFlags As Long) As Long

'Проигрываем файл

Call sndPlaySound("ИМЯ ВАШЕГО ФАЙЛА", 0)


Без Api

В данной статье я приведу некоторые ситуации, когда вроде бы не возможно обойтись без объявления соответствующих Api функций, но на самом деле выход есть (Все перечисленные ниже примеры работали на WinMe/98, возможно, на Win200 они работать не будут) :
Создайте новый проект, добавьте на созданную вместе с проектом форму, новую кнопку (Command1). И добавьте следующий код:

Пример №1: Перезагрузка компьютера:

Private Sub Command1_Click()
'Всего одна строчка кода!
Shell "rundll32 shell32,SHExitWindowsEx 2"
'Если заменить 2 на 1, то получим функцию для выключения компьютера
End Sub

Пример №2: Выключение компьютера:

Private Sub Command1_Click()
Shell "shell32,SHExitWindowsEx 1"
End Sub

Пример №3: Вызвать окно "Форматирование: Диск 3,5 (А:):

Private Sub Command1_Click()
Shell "rundll32 shell32,SHFormatDrive"
End Sub

Пример №4: Открыть "Свойства экрана":

Private Sub Command1_Click()
Shell"rundll32 shell32,Control_RunDLL desk.cpl"
End Sub

Пример №5: Выстраивает все не свернутые окна сверху вниз:

Private Sub Command1_Click()
Shell"rundll32 user,tilechildwindowsl"
End Sub

Пример №6: Обновить рабочий стол:

Private Sub Command1_Click()
Shell"rundll32 user,repaintscreen"
End Sub

Пример №7: Отключить клавиатуру:

Private Sub Command1_Click()
Shell "rundll32 keyboard,disable"
End Sub

Пример №8: Отключить мышь (Если использовать в программе функцию отключения клавиатуры и мыши, то такой прогой можно напугать своего недруга:)):

Private Sub Command1_Click()
Shell "rundll32 mouse,disable"
End Sub

Пример №9: Функция Environ:

Private Sub Command1_Click()
MsgBox Environ ("TMP") 'Выводит директорию временных файлов
MsgBox Environ ("COMSPEC") 'Выводит загрузчик ДОСовской оболочки(обычно, command.com)
MsgBox Environ ("PATH") 'Выводит пути, объявленные в autoexec.bat
MsgBox Environ ("WINDIR") 'Выводит каталог Windows
End Sub

Вот и всё! Не надо никаких громоздких объявлений функций, констант, структур.


VB - Forever!

Сайт журнала
Главная страница

Статьи

WinApi
 Без Api
Окна и манипуляторы.
Часть #1 Теория
Окна и манипуляторы
Часть #2 Практика

Звук
 Проигрываем музыкальные файлы
Звук через внутренний динамик
Пишем говорящую программу

Распространение
Создаем оболочку для CD

Для VB программиста
Обзор VB сайтов
Обзор полезных программ
Примеры

Пример экранной заставки
Бегущая строка с ссылкой
Манипуляция с Пуском
FAQ
Часто задаваемые вопросы
Информация

Условия использования материалов
Написать письмо автору журнала
Посетить сайт журнала


Полезные программы

В этой статье я расскажу вам об интересных программах, которые так или иначе связаны с программированием на Visual Basic.

VB-PowerWrap

Очень часто в различных форумах я видел, как задавали примерно такой вопрос: "А как запихнуть все ocx-компоненты и библиотеки в исполняемый файл ?". Отвечаю, с помощью программы VB-PowerWrap. Она не только засунет все ваши компоненты в исполняемый файл, но и сожмёт их. Но не смотря на это размер исполняемого файла станет гораздо больше.

PowerBasic

Вы хотите создать консольное приложение? Думаю хотите, или хотя бы задумывались над этим, но на VB создавать консольные приложения очень сложно:( Но это не проблема, существует программа PowerBasic, с помощью которой вы без особых усилий сможете создавать консоли, для этого вам потребуются только знания обычного QBasic.

Aspack

Существует очень полезная программа, называется она Aspack. Если вы создали программу, но она имеет очень большой размер, вы можете сжать её с помощью Aspack. Aspack сжимает приложения (*.exe), дополнительные компоненты (*.ocx) и динамические библиотеки (*.dll).

Setup Generator Pro

Программа Setup Generator Pro пожет вам создавать установочные файлы. Программа полностью поддерживает русский язык и имеет русский интерфейс. Setup Generator Pro сжимает все файлы, входящие в вашу программу. Также имеется куча различных настроек для создаваемого установочного файла, таких как цвет фона, шрифт, язык, загрузочная картинка, файл лицензии и т.д.


Условия использования материалов

Автор статей не несёт никакой ответственности за возможные ошибки в статьях или примерах и за те моральные и физические увечья, которые вы или ваш компьютер можете получить, руководствуясь информацией, почёрпнутой из статей номера.
Вы имеете право разместить любую из статей номера на своём сайте, но перед этим предупредив автора статьи.

Хованский Ян (Редактор журнала)


Обзор VB сайтов

В данном разделе вы найдёте ссылки на интересные сайты, посвящённые программированию на Visual Basic

1. VBNET - здесь ты найдёшь всё!!! Статьи, исходники, огромная библиотека кодов, программы, книги,
форум и многое другое на vbnet.ru.
http://vbnet.ru

2. VB Mania - онлайн-журнал о Visual Basic. Много интересного материала, советую посетить.
http://www.vbmania.ru

3. Visual Basic на русском - старейший сайт посвящённый VB. Большое количество информации: исходники, статьи, контролы, vb хитрости, популярные ошибки, конференция.
http://vbrussian.com

4. Русский проект - интересные примеры, в основном различные графические эффекты, но особенно хочется отметить раздел справочники, где вы можете скачать help`ы по языку Visual Basic.
http://rusproject.narod.ru

5. Улицы Visual Basic - сайт посвящённый программированию игр на Visual Basic. Исходники, статьи, FAQ, ActiveX и многое другое. Обязательно посетите!
http://vbstreets.ru


Окна и манипуляторы Теория

Окна

В данной статье я расскажу вам об окнах и манипуляторах, потому что во многих Api функциях требуется знание понятий окна и манипулятора окна.
Что же такое окно? Окно - это объект, занимающий прямоугольный участок экрана. Он может содержать другие окна, называемые дочерними.
Запомните: всё, что находится на экране, представляет собой окно. Формы, элементы управления, кнопки, полосы прокрутки, текстовые поля - являются окнами.

Классы окон

Но возникает вопрос. Как такие разные объекты, как кнопки, формы и текстовые поля, могут быть окнами? Каким образом система различает их?
Дело в том, что каждое окно относится к какому-то классу:
Например кнопка относится к классу BUTTON, текстовое поле относится к классу EDIT, полоса прокрутки относится к классу SCROLLBAR и т.д.
Таким образом, система различает окна, определяя класс, к которому относится окно.

Манипуляторы окон

С помощью Api функций вы можете производить различные операции с окнами (Скрытие/показ окон, изменение заголовка(текста) окна, изменять различные атрибуты ), но для этого вам нужно понять, что такое манипулятор. Манипулятор это способ идентификации окна(и вообще любого объекта, но в данной статье рассматриваются только манипуляторы окон) в системе. У каждого окна в системе имеется манипулятор окна, который обычно обозначается сокращением hWnd. Visual Basic предоставляет возможность получить манипулятор окна, через его свойство hWnd.
Запомните: графические элементы, такие как label и image не являются окнами и поэтому не имеют манипулятора окна и следовательно с графическими элементами нельзя проводить различные операции используя Api функции.

Получение информации об окнах

Сейчас мы поговорим о том, как получить манипулятор окна с помощью Api функций:

Способ №1 Поиск окна по его заголовку

Это делается с помощью Api функции FindWindow:

'Объявляем функцию

Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" _
(ByVal lpClassName As String, ByVal lpWindowName As String) As Long

'Процедура для получения манипулятора окна по его заголовку
Public Function GetHwnd(Caption As String) As Long
Dim hwnd As Long
hwnd = FindWindow(vbNullString, Caption) 'Caption - заголовок окна
GetHwnd = hwnd
End Function

Способ №2 Поиск окна по его классу

'Объявляем функцию

Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" _
(ByVal lpClassName As String, ByVal lpWindowName As String) As Long

'Процедура для получения манипулятора окна по его классу
Public Function GetHwnd(Class As String) As Long
Dim hwnd As Long
hwnd = FindWindow(Class, vbNullString)
GetHwnd = hwnd
End Function

Способ №3 Способ поиск дочернего окна

'Функция для получения окна первого уровня

Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" _
(ByVal lpClassName As String, ByVal lpWindowName As String) As Long

'Функция для получения дочернего окна

Private Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" _
(ByVal hWnd1 As Long, ByVal hWnd2 As Long, ByVal lpsz1 As String, ByVal lpsz2 As String) As Long

'Разместите на форме кнопку (Command1)

Private Sub
  Command1_Click()
Dim hwnd As Long
hwnd = FindWindow("Класс родителя", "Заголовок родителя")
  'Поиск родителя
hwnd = FindWindowEx(hwnd, 0, "Класс дочернего окна", "Заголовок
  дочернего окна") 'Поиск дочернего окна
End Sub

Вот и всё, ваше начальное знакомство с окнами завершено, переходите к практике


Окна и манипуляторы Практика

Прочитав теорию, вы можете смело переходить к практике. На практике мы будем проводить различные операции с окнами, средствами WinApi.

Пример №1 Скрываем кнопку Пуск:

1. Создайте новый проект.
2. На создавшейся вместе с проектом форме разместите две кнопки.
3. Назовите первую кнопку cmdHide, и измените свойство Caption на "Скрыть кнопку Пуск", вторую кнопку назовите cmdShow и измените Caption на "Показать кнопку Пуск".
После перечисленных действий форма должна иметь примерно такой вид:

4. Добавьте следующий код:

Option Explicit
'Функция для поиска окна первого уровня
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
'Функция для поиска дочернего окна
Private Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" (ByVal hWnd1 As Long, ByVal hWnd2 As Long, ByVal lpsz1 As String, ByVal lpsz2 As String) As Long
'Функция для скрытия/показа окна
Private Declare Function ShowWindow Lib "user32" (ByVal hWnd As Long, ByVal nCmdShow As Long) As Long
'Манипулятор окна
Dim hnd As Long

Private Sub Form_Load()
'Кнопка Пуск является дочерним окном панели задач
'Кнопка Пуск относится к классу "BUTTON", Панель задач относится к классу "Shell_TrayWnd"
'Ищем манипулятор панели задач
hnd = FindWindow("Shell_TrayWnd", vbNullString)
'Ищем манипулятор кнопки пуск
hnd = FindWindowEx(hnd, 0, "BUTTON", vbNullString)
End Sub

Private Sub cmdHide_Click()
'Скрываем окно с заданным манипулятором
ShowWindow hnd, 0
End Sub

Private Sub cmdShow_Click()
'Показываем окно с заданным манипулятором
ShowWindow hnd, 1
End Sub

Теперь при нажатии на первую кнопку Пуск исчезает, при нажатии на вторую пояляется снова.

Пример можно скачать здесь

Пример №2 Меняем заголовок заданного окна

1. Создайте новый проект.
2. На создавшейся вместе с проектом форме разместите две метки, два текстовых поля и одну кнопку
3. Назовите первое текстовое поле txt1, второе txt2, кнопку cmdRename.
После перечисленных действий форма должна иметь примерно такой вид:

4. Добавьте следующий код:

Option Explicit
'Функция для поиска окна первого уровня
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
'Функция для изменения заголовка окна
Private Declare Function SetWindowText Lib "user32" Alias "SetWindowTextA" (ByVal hwnd As Long, ByVal lpString As String) As Long

Private Sub cmdRename_Click()
Dim hwn As Long
'Ищем окно по его заголовку
hwn = FindWindow(vbNullString, txt1)
'Меняем заголовок окна
SetWindowText hwn, txt2
End Sub

Теперь при нажатии на кнопку можно изменить заголовок любого окна.

Пример можно скачать здесь

Пример №3 Меняем часики в трее на свои

1. Создайте новый проект.
2. На создавшейся вместе с проектом форме разместите таймер и метку
3. Имя таймера timer1, interval = 50
4. Имя метки lblTime, Top = 0, left = 0
5. Добавьте следующий код:

Option Explicit
'Функция для поиска окна первого уровня
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
'Функция для поиска дочернего окна
Private Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" (ByVal hWnd1 As Long, ByVal hWnd2 As Long, ByVal lpsz1 As String, ByVal lpsz2 As String) As Long
'Функция назначает окну нового родителя
Private Declare Function SetParent Lib "user32" (ByVal hWndChild As Long, ByVal hWndNewParent As Long) As Long
Private Sub Form_Load()
Dim hnd As Long
'Часики является дочерним окном трея
'И в свою очередь трей является дочерним окном панели задач
'Ищем манипулятор панели задач (класс панели задач: Shell_TrayWnd)
hnd = FindWindow("Shell_TrayWnd", vbNullString)
'Ищем манипулятор трея (класс трея: TrayNotifyWnd)
hnd = FindWindowEx(hnd, 0, "TrayNotifyWnd", vbNullString)
'Ищем манипулятор часиков (класс часиков: TrayClockWClass)
hnd = FindWindowEx(hnd, 0, "TrayClockWClass", vbNullString)
'Вставляем нашу формы вместо часиков
Me.Left = 0
Me.Top = 0
SetParent Me.hWnd, hnd
End Sub

Private Sub Timer1_Timer()
lblTime = Time
End Sub

Теперь в трее, пока работает приложение будут другие часики.
Примечание: в данном примере размеры размер часиков выбраны примерные, в следующих номерах журнала будет разобрано как определить размер часиков (и вообще других окон) на 100% точно.

Пример можно скачать здесь

В данной статье часто упоминались классы различных окон (трей, панель задач и т.д.). Определяются они очень просто, с помощью программ Microsoft Spy++. Spy++ выдаст вам исчёрпывающую информацию о любом окне в системе. Программа находится входит в состав Microsoft Visual Studio 6.0

Практика закончена, но в следующих номерах журнала данная тема будет продолжена:)